package com.innodata.riskEngine.utils;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author liboshuai
 * @Date 2023/11/6 22:17
 * 本地缓存实用工具类
 */
public class LocalCacheUtil<K, V> {
    // 缓存对象
    private final Cache<K, V> cache;

    /**
     * 构造方法，初始化缓存对象
     *
     * @param maxSize   缓存的最大条目数
     * @param duration  缓存条目的有效期长度
     * @param unit      缓存条目的有效期的时间单位
     */
    public LocalCacheUtil(long maxSize, long duration, TimeUnit unit) {
        // 使用 CacheBuilder 构建一个新的缓存对象
        cache = CacheBuilder.newBuilder()
                .maximumSize(maxSize) // 设置缓存的最大容量
                .expireAfterWrite(duration, unit) // 设置写入后的过期时间
                .build(); // 创建 Cache 对象
    }

    /**
     * 将一个键值对添加到缓存中
     *
     * @param key   键
     * @param value 值
     */
    public void put(K key, V value) {
        cache.put(key, value);
    }

    /**
     * 从缓存中获取与键关联的值，如果该键不存在，则返回 null
     *
     * @param key 键
     * @return    与键关联的值，如果该键不存在，则返回 null
     */
    public V get(K key) {
        return cache.getIfPresent(key);
    }

    /**
     * 从缓存中移除与键关联的值
     *
     * @param key 键
     */
    public void invalidate(K key) {
        cache.invalidate(key);
    }

    /**
     * 移除缓存中的所有条目
     */
    public void invalidateAll() {
        cache.invalidateAll();
    }

    /**
     * 获取缓存中所有的键值对
     *
     * @return 返回一个 Map，其中包含缓存中所有的键值对
     */
    public Map<K, V> getAll() {
        return cache.asMap();
    }
}